﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using System.Data;
using System.Data.Entity;
using System.Data.Objects;

namespace SIGCBI.Repository
{
    public interface IPecosaRepository
    {
        List<PECOSA> GetAllFromPecosa();
        List<PECOSA> GetFromPecosaByCriterioAndAreaAndFecha(string solicitante, string nroDoc, string area, DateTime? fec1, DateTime? fec2);

        PECOSA GetFromPecosaById(Int32 id);

        void AddPecosa(PECOSA pecosa);
        void UpdatePecosa(PECOSA pecosa);
    }

    public class PecosaRepository : MasterDataAccess, IPecosaRepository
    {
        public List<PECOSA> GetAllFromPecosa()
        {
            var hoy = DateTime.Today.Date;
            var query = from c in Context.PECOSAs.Include("TRABAJADOR").Include("AREA.TRABAJADOR")//.Include("DETALLE_GUIA_ENTRADA.PRODUCTO")
                        orderby c.Fecha descending
                        //where c.Fecha == hoy
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }

        public List<PECOSA> GetFromPecosaByCriterioAndAreaAndFecha(string solicitante, string nroDoc, string area, DateTime? fec1, DateTime? fec2)
        {
            var query = from h in Context.PECOSAs.Include("TRABAJADOR").Include("AREA.TRABAJADOR")//.Include("DETALLE_GUIA_ENTRADA.PRODUCTO")
                        select h;

            if ((solicitante != "" && solicitante != null) || (nroDoc != "" && nroDoc != null))
            {
                if (area != "" && area != null)
                {
                    if (fec1 != null && fec2 != null)
                    {
                        query = from h in query
                                where (h.Fecha >= fec1.Value && h.Fecha <= fec2.Value) &&
                                (h.TRABAJADOR.NombreCompleto.ToUpper().Contains(solicitante.ToUpper()) ||
                                        h.NroDoc.ToUpper().Contains(nroDoc.ToUpper()))
                                        && h.AREA.Descripcion.ToUpper().Contains(area.ToUpper())
                                orderby h.Fecha descending
                                select h;

                        ObjectContext.Refresh(RefreshMode.StoreWins, query);
                    }
                    else
                    {
                        query = from h in query
                                where (h.TRABAJADOR.NombreCompleto.ToUpper().Contains(solicitante.ToUpper()) ||
                                        h.NroDoc.ToUpper().Contains(nroDoc.ToUpper()))
                                        && h.AREA.Descripcion.ToUpper().Contains(area.ToUpper())
                                orderby h.Fecha descending
                                select h;

                        ObjectContext.Refresh(RefreshMode.StoreWins, query);
                    }
                }
                else if (fec1 != null && fec2 != null)
                {
                    query = from h in query
                            where (h.Fecha>= fec1.Value && h.Fecha<= fec2.Value)
                            && (h.TRABAJADOR.NombreCompleto.ToUpper().Contains(solicitante.ToUpper()) ||
                            h.NroDoc.ToUpper().Contains(nroDoc.ToUpper()))
                            orderby h.Fecha descending
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);
                }
                else
                {
                    query = from h in query
                            where h.TRABAJADOR.NombreCompleto.ToUpper().Contains(solicitante.ToUpper()) ||
                                    h.NroDoc.ToUpper().Contains(nroDoc.ToUpper())
                            orderby h.Fecha descending
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);
                }
            }

            ///////////////////////////////////////

            if (area != "" && area != null)
            {
                if ((solicitante != "" && solicitante != null) || (nroDoc != "" && nroDoc != null))
                {
                    if (fec1 != null && fec2 != null)
                    {
                        query = from h in query
                                where (h.Fecha>= fec1.Value && h.Fecha <= fec2.Value) &&
                                (h.TRABAJADOR.NombreCompleto.ToUpper().Contains(solicitante.ToUpper()) ||
                                        h.NroDoc.ToUpper().Contains(nroDoc.ToUpper()))
                                        && h.AREA.Descripcion.ToUpper().Contains(area.ToUpper())
                                orderby h.Fecha descending
                                select h;

                        ObjectContext.Refresh(RefreshMode.StoreWins, query);
                    }
                    else
                    {
                        query = from h in query
                                where (h.TRABAJADOR.NombreCompleto.ToUpper().Contains(solicitante.ToUpper()) ||
                                        h.NroDoc.ToUpper().Contains(nroDoc.ToUpper()))
                                        && h.AREA.Descripcion.ToUpper().Contains(area.ToUpper())
                                orderby h.Fecha descending
                                select h;

                        ObjectContext.Refresh(RefreshMode.StoreWins, query);
                    }
                }
                else if (fec1 != null && fec2 != null)
                {
                    query = from h in query
                            where (h.Fecha >= fec1.Value && h.Fecha <= fec2.Value)
                            && h.AREA.Descripcion.ToUpper().Contains(area.ToUpper())
                            orderby h.Fecha descending
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);
                }
                else
                {
                    query = from h in query
                            where h.AREA.Descripcion.ToUpper().Contains(area.ToUpper())
                            orderby h.Fecha descending
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);
                }
            }

            ////////////////////////////////////////

            return query.ToList();
        }

        public PECOSA GetFromPecosaById(int id)
        {
            var query = from c in Context.PECOSAs.Include("DETALLE_PECOSA.PRODUCTO.UNIDAD_MEDIDA") 
                        where c.ID.Equals(id)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }

        public void AddPecosa(PECOSA pecosa)
        {

            foreach (var item in pecosa.DETALLE_PECOSA)
            {
                Context.Entry(item.PRODUCTO).State = EntityState.Unchanged;
                Context.Entry(item).State = EntityState.Added;
            }

            if (pecosa.TRABAJADOR != null)
            {
                Context.Entry(pecosa.TRABAJADOR).State = EntityState.Unchanged;
                //Context.Entry(guiaEntrada.AREA).State = EntityState.Unchanged
            };

            Context.PECOSAs.Add(pecosa);
            Context.SaveChanges();
        }

        public void UpdatePecosa(PECOSA pecosa)
        {
            var estadosDetalle = Context.ChangeTracker.Entries<GUIA_ENTRADA>();

            pecosa.TRABAJADOR = null;
            pecosa.AREA = null;

            //Context.Entry(guiaEntrada.PROVEEDOR).State = EntityState.Unchanged;
            //Context.Entry(guiaEntrada.AREA).State = EntityState.Unchanged;

            Context.Entry(pecosa).State = EntityState.Modified;

            foreach (var item in pecosa.DETALLE_PECOSA)
            {
                item.PRODUCTO = null;

                Context.Entry(item).State = item.ID == Int32.Parse("0") ? System.Data.EntityState.Added : System.Data.EntityState.Modified;
                item.IdProducto = item.IdProducto;
            }

            Context.SaveChanges();
        }
    }
}
